﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZDSoft.LMS.Domain;
using NHibernate;
using Castle.ActiveRecord;
using Castle.ActiveRecord.Queries;

namespace ZDSoft.LMS.Manager
{
    public class UserManager : ManagerBase<User>
    {
        #region hql测试,create by lengyahong
        public void CreateTest(User user)
        {
           //一般不用hql语句创建对象，如果要操作，请使用原生sql
            return;
        }

        public void UpdateTest(User user)
        {
            //获取管理User的session对象
            using (ISession session = ActiveRecordBase.holder.CreateSession(typeof(User)))
            {
                //定义hql语句(注意参数的设置方法,这里是第1种设置法)
                string hql = "update User user set user.UserName = :UserName,user.Version = :Version where user.ID = :ID";

                //创建执行对象
                IQuery query = session.CreateQuery(hql);//SqlCommend
                //给参数赋值
                query.SetParameter("UserName", user.UserName);
                query.SetInt32("Version", user.Version + 1);
                query.SetInt32("ID", user.ID);
                //执行更新
                query.ExecuteUpdate();               
            }
        }

        public void DeleteTest(User user)
        {
            //获取管理User的session对象
            using (ISession session = ActiveRecordBase.holder.CreateSession(typeof(User)))
            {
                //定义hql语句(注意参数的设置方法,这里是第2种设置法)
                string hql = "delete from User user where user.ID = ?";

                //创建执行对象
                IQuery query = session.CreateQuery(hql);
                //给参数赋值
                query.SetInt32(0, user.ID);
                //执行删除
                query.ExecuteUpdate();
            }
        }

        public User GetTest(int id)
        {
            User user = null;

            //定义hql语，以下两种写法都ok
            //string hql = "from User user where user.ID = ?";
            string hql = "select user from User user where user.ID = :ID";

            /* 第一种方法，很灵活
            //获取管理User的session对象
            using (ISession session = ActiveRecordBase.holder.CreateSession(typeof(User)))
            {
                //创建执行对象
                IQuery query = session.CreateQuery(hql);
                //给参数赋值
                query.SetInt32("ID", id);
                //执行查询，并返回满足条件的第一条数据，如果对象不存在，则返回null
                user = query.List<User>().FirstOrDefault();
            }
            */

            //第2中方法，使用简单，相对死板
            //使用SimpleQuery查询，该查询的结果为数组，即多行数据
            SimpleQuery query = new SimpleQuery(typeof(User), hql);
            //给参数赋值
            query.SetParameter("ID", id);
            //执行并返回查询结果
            User[] list = (User[])ActiveRecordBase.ExecuteQuery(query);//注意这句话的使用
            if (list != null && list.Length > 0)
                user = list[0];

            return user;
        }


        public int CountTest(string userName)
        {
            int count = 0;
            
            string hql = "select count(user) from User user";
            if (!string.IsNullOrEmpty(userName))
                hql = " where user.UserName = :UserName ";
            //说明：count(user)，只统计user对象的个数,不能使用count(*)，因为跟User想关联的对象很多

            #region 查询
            /*
            //第一种方法，很灵活
            //获取管理User的session对象
            using (ISession session = ActiveRecordBase.holder.CreateSession(typeof(User)))
            {
                //创建执行对象
                IQuery query = session.CreateQuery(hql);
                //给参数赋值
               if (!string.IsNullOrEmpty(userName))
                    query.SetParameter("UserName", userName);

                //执行并返回结果
                var result = query.List<int>();
                if (result != null && result.Count > 0)
                    count = result[0];
            }
            */

            //第2中方法，使用简单，相对死板
            //使用ScalarQuery查询，该查询的结果为单个值，以下有2种写法
            //ScalarQuery query = new ScalarQuery(typeof(User), hql);
            ScalarQuery<int> query = new ScalarQuery<int>(typeof(User), hql);
            //给参数赋值
            if (!string.IsNullOrEmpty(userName))
                query.SetParameter("UserName", userName);
            //执行并返回查询结果
            var result = ActiveRecordBase.ExecuteQuery(query);//注意这句话的使用
            if (result != null)
                count = Convert.ToInt32(result);
    
            #endregion

            return count;
        }
        #endregion
    }
}
